home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / ebsx130 / menu2.c < prev    next >
Text File  |  1997-05-02  |  6KB  |  297 lines

  1. /* EB.X V1.40d
  2.    1996.05.2 鈴木 健児 */
  3.  
  4. #include "common2.h"
  5.  
  6. #include <iocslib.h>
  7. #include <jctype.h>
  8. #include <method/Dialog_i.h>
  9. #include <method/Event_i.h>
  10. #include <method/Memory_i.h>
  11. #include <method/Task_i.h>
  12. #include <method/Dos_i.h>
  13. #include <method/_methodSx.h>
  14.  
  15.  
  16. /*  */
  17. int        init_linktbl( void );
  18. int        find_linkdata( int );
  19. int        push_link_a( short , short );
  20. int        push_link_b( unsigned int );
  21. int        get_foward( void );
  22. int        get_next( void );
  23. int        get_up( void );
  24. unsigned int    conv_hex( unsigned int data );
  25. int        init_kaisoutbl( void );
  26. int        push_menukaisou( unsigned int );
  27. int        init_rirekitbl( void );
  28. int        push_rireki( int );
  29.  
  30. static int            menuposmax;    /* static ではない */
  31.  
  32. static unsigned int    menukaisoutbl[ 34 ];
  33. int        menukaisoumax;
  34.  
  35. static unsigned int    rirekitbl[ 258 ];
  36. int        rirekimax;
  37.  
  38. int        nextflg;
  39. int    linkflg;
  40.  
  41. /*  */
  42. typedef struct linkinfo {
  43.     short    l_type;        /* タイプ グラフィック、メニュー、音声、参照 */
  44.     short    textpos;    /* テキスト内の位置(@のある場所) */
  45.     long    linkpos;    /* リンク先のファイル位置 */
  46. } linkinfo;
  47.  
  48. linkinfo linktbl[ 512 ];
  49. int linkMax;
  50.  
  51. /* 関数 */
  52.  
  53. int    find_linkdata( int textpos )
  54. {
  55.     int    count;
  56.     int    flg;
  57.     int    offset;
  58.  
  59.     flg = -1;
  60.     count = 0;
  61.  
  62.     while( textpos >= linktbl[ count ].textpos )
  63.     {
  64. /*    ULError_int( linktbl[ count ].textpos );
  65. */
  66.         if( textpos == linktbl[ count ].textpos )
  67.         {
  68.             flg = count;
  69.         };
  70.         count++;
  71.     };
  72.  
  73.     if( flg >= 0 )
  74.     {
  75.         switch( linktbl[ flg ].l_type )
  76.         {
  77.             case 1:
  78.                 DispImage( linktbl[ flg ].linkpos );
  79.                 break;
  80.             case 2:
  81.                 nextpos = linktbl[ flg ].linkpos;
  82.                 push_menukaisou( nextpos );
  83.                 DOSSEEK( cdfile , nextpos , SEEK_SET );
  84.                 init_rirekitbl();
  85.                 init_linktbl();
  86.                 offset = jis2shift( tex , 0x800*4 , 0 , &nextflg );
  87.                 push_rireki( nextpos );
  88.                 nextpos += offset;
  89.                 DispMenu( );
  90.                 break;
  91.             case 3:
  92.                 DispLink( linktbl[ flg ].linkpos );
  93.                 break;
  94.             case 4:
  95.                 DispImageEP( linktbl[ flg ].linkpos );
  96.                 break;
  97.         };
  98. /*    ShowMenu( menupostbl[ num-1 ] );
  99. */
  100.     };
  101.  
  102.     return( 0 );
  103. };
  104.  
  105.  
  106. int    get_foward( void )
  107. {
  108.     int    offset;
  109.  
  110.         /* f */
  111.     if( rirekimax > 1 )
  112.     {
  113.         nextpos = rirekitbl[ rirekimax-1 ];
  114. /*    ULError_int( rirekitbl[ rirekimax-1] ); */
  115.         DOSSEEK( cdfile , nextpos , SEEK_SET );
  116.         rirekimax--;
  117.         init_linktbl();
  118.         offset = jis2shift( tex , 0x800*4 , 0 , &nextflg );
  119.         nextpos += offset;
  120.     }
  121.  
  122.     return( 0 );
  123. }
  124.  
  125. int    get_next( void )
  126. {
  127.     int    offset;
  128.  
  129.         /* n */
  130.     if( nextflg == 1 )
  131.     {
  132.         if(( rirekimax > 0 ) && ( rirekimax <= 256 ))
  133.         {
  134.             if( rirekitbl[ rirekimax+1 ] != 0 )
  135.             {
  136.                 nextpos = rirekitbl[ rirekimax+1 ];
  137.                 menukaisoutbl[ menukaisoumax ] = nextpos;
  138. /* ULError_int( rirekitbl[ rirekimax+1] );    */
  139.                 DOSSEEK( cdfile , rirekitbl[ rirekimax+1 ] , SEEK_SET );
  140.                 rirekimax++;
  141.                 init_linktbl();
  142.                 offset = jis2shift( tex , 0x800*4 , 0 , &nextflg );
  143.                 nextpos += offset;
  144. /*    ULError_int( nextpos );    */
  145.  
  146.             } else {
  147.     /*    ULError_int( nextpos );    */
  148.                 DOSSEEK( cdfile , nextpos , SEEK_SET );
  149.                 push_rireki( nextpos );
  150.                 menukaisoutbl[ menukaisoumax ] = nextpos;
  151.                 init_linktbl();
  152.                 offset = jis2shift( tex , 0x800*4 , 0 , &nextflg );
  153.                 nextpos += offset;
  154. /*    ULError_int( nextpos );    */
  155.             };
  156.         };
  157.     };
  158.  
  159.     return( 0 );
  160. }
  161.  
  162. int    get_up( void )
  163. {
  164.     int offset;
  165.  
  166.     if( menukaisoumax >= 2 )
  167.     {
  168.         menukaisoumax-=2;
  169.     /* printf( "pr up = %d\n" , menukaisoumax ); */
  170.         nextpos = menukaisoutbl[ menukaisoumax+1 ];
  171.  
  172.         push_menukaisou( nextpos );
  173.  
  174. /* printf( "prt = %d\n", menukaisoumax ); */
  175.         init_rirekitbl( );
  176.         init_linktbl( );
  177.         DOSSEEK( cdfile , nextpos , SEEK_SET );
  178.         offset = jis2shift( tex , 0x800*4 , 0 , &nextflg );
  179.  
  180.         if( nextflg == 1 )    /* メニュー項目の場合は履歴に残さない(nextを禁止する) */
  181.         {
  182. /* printf( "PUSH RIREKI\n" ); */
  183.             push_rireki( nextpos );
  184.         };
  185.  
  186.         nextpos += offset;
  187.     };
  188.  
  189.     return( 0 );
  190. }
  191.  
  192. int    init_linktbl( void )
  193. {
  194.     linktbl[ 0 ].textpos = 0x7fff;
  195.     menuposmax = 0;
  196.  
  197.     return( 0 );
  198. }
  199.  
  200.  
  201. int    push_link_a( short l_type , short textpos )
  202. {
  203.     if( menuposmax == 512 )
  204.     {
  205.         return( -1 );
  206.     };
  207.  
  208. /* ULError_int( textpos );
  209. */    linktbl[ menuposmax ].l_type = l_type;
  210.     linktbl[ menuposmax ].textpos = textpos;
  211.  
  212. /* ULError_int( linktbl[ menuposmax].textpos );
  213. */
  214.     return( 0 );
  215. }
  216.  
  217. int    push_link_b( unsigned int linkpos )
  218. {
  219.     if( menuposmax == 512 )
  220.     {
  221.         return( -1 );
  222.     };
  223.  
  224.     linktbl[ menuposmax ].linkpos = linkpos;
  225.     menuposmax++;
  226.     linktbl[ menuposmax ].textpos = 0x7fff;    /* 大きい値 */
  227.  
  228.     return( 0 );
  229. }
  230.  
  231. int    init_kaisoutbl( void )
  232. {
  233.     menukaisoutbl[ 0 ] = 0;
  234.     menukaisoumax = 0;
  235.  
  236.     return( 0 );
  237. }
  238.  
  239. int    push_menukaisou( unsigned int filepos )
  240. {
  241.     if( menukaisoumax == 32 )
  242.     {
  243.         return( -1 );
  244.     };
  245.  
  246.     menukaisoumax++;
  247.     menukaisoutbl[ menukaisoumax ] = filepos;
  248.  
  249.     return( 0 );
  250. }
  251.  
  252. int    init_rirekitbl( void )
  253. {
  254.     rirekitbl[ 0 ] = 0;
  255.     rirekimax = 0;
  256.  
  257.     return( 0 );
  258. }
  259.  
  260. int    push_rireki( int rireki )
  261. {
  262.     if( rirekimax == 256 )
  263.     {
  264.         return( -1 );
  265.     };
  266.  
  267.     rirekimax++;
  268.     rirekitbl[ rirekimax ] = rireki;
  269.     rirekitbl[ rirekimax+1 ] = 0;
  270.  
  271.     return( 0 );
  272. }
  273.  
  274. /* BCDコードを16進に変換 */
  275. unsigned int    conv_hex( unsigned int data )
  276. {
  277.     unsigned int    data16;
  278.     unsigned char    hhh,hhl,hlh,hll;
  279.     unsigned char    lhh,lhl,llh,lll;
  280.  
  281.     data16 = 0;
  282.  
  283.     hhh = (data & 0xf0000000) >> 28;
  284.     hhl = (data & 0x0f000000) >> 24;
  285.     hlh = (data & 0x00f00000) >> 20;
  286.     hll = (data & 0x000f0000) >> 16;
  287.     lhh = (data & 0x0000f000) >> 12;
  288.     lhl = (data & 0x00000f00) >> 8;
  289.     llh = (data & 0x000000f0) >> 4;
  290.     lll = (data & 0x0000000f);
  291.  
  292.     data16 = hhh*10000000 + hhl*1000000 + hlh*100000 + hll*10000;
  293.     data16 = data16 + lhh*1000 + lhl*100 + llh*10 + lll;
  294.  
  295.     return( data16 );
  296. }
  297.